package me.timlong;

public class OddsEvensSplit {

    /**
     * 题目描述
     * 输入一个整数数组，实现一个函数来调整该数组中数字的顺序，
     * 使得所有的奇数位于数组的前半部分，所有的偶数位于数组的后半部分，
     * 并保证奇数和奇数，偶数和偶数之间的相对位置不变。
     *
     * @param array
     */
    public void reOrderArray_new(int [] array) {
//        解决问题的思路：
//        用两个指针i，j进行遍历，i->首个偶数，j->首个奇数，ij调换，i后的偶数平移。

        int i = 0;
        int j = i + 1;

        int  len = array.length;
        int tempOdds;
        while(j < len){
            while(i < len && isOdds(array[i]))
                i++;
            j = i + 1;
            while(j < len && !isOdds(array[j]))
                j++;

            if(j < len) {
                tempOdds = array[j];
                for (int p = j; p > i; p--)
                    array[p] = array[p - 1];
                array[i] = tempOdds;
                i++;
                j = i + 1;
            }
        }
    }

    /**
     * 奇数or偶数
     * @param num
     */
    private boolean isOdds(int num){
        if(1 == (num & 1))
            return true;
        else
            return false;
    }


    public void reOrderArray(int [] array) {

        int len = array.length;
        int oddsNum = 0;
        for(int i = 0; i < len; i++){
            if(1 == (array[i] % 2))
                oddsNum++;
        }

        int i = 0, j = oddsNum;
        while(i < oddsNum && j < len) {
            while (i < len - 1 && 1 == (array[i] % 2))
                i++;
            while (j < len - 1 && 0 == (array[j] % 2))
                j++;
            swap(array, i, j);
            i++; j++;
        }
    }

    public void swap(int[] array, int i, int j){
        array[i] += array[j];
        array[j] = array[i] - array[j];
        array[i] = array[i] - array[j];
    }

    public static void main(String[] args) {

        int[] arr = {0, -2, 3, 5, 6, 8, 9, 10, 7, 43, 34, 78, 90};
        new OddsEvensSplit().reOrderArray_new(arr);

        for(int i = 0; i < arr.length; i++)
            System.out.println(arr[i] + ", ");
    }




}
